iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
自我挑戰組

打掉重練!Django的還債之旅~系列 第 20

Day20. 怎麼看django組出來的SQL!

  • 分享至 

  • xImage
  •  

前言

那麼今天要來看看,怎麼在django裡面看到django本身組合出來的SQL呢!?
這個也只是我單純好奇,常常聽到有人會說用ORM生出來的SQL效能不佳等等的評語,不過今天我們只是單純看看django生成出來的SQL而已,並不會討論效能這項問題就是了,我自己是很喜歡使用ORM,因為寫ORM讓我感覺程式碼看起來的樣子比較舒服,當然這只是個人觀感~SQL還是很重要的!要會!

正題

今天一共會有三種方式來看django生成的SQL~
其中一種是看migration會對django下什麼指令,另外兩種則是看django接受到request後在我們view下ORM的SQL~

  • python manage.py sqlmigrate "app name" "migrations number like 0001"
  • logging
  • debug_toolbar (套件)

sqlmigrate

首先呢就是sqlmigrate指令啦~
我的migration長這樣,檔名"0001_initial.py"

# Generated by Django 4.2.5 on 2023-09-27 11:09

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Person',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=255)),
            ],
            options={
                'db_table': 'person',
            },
        ),
        migrations.CreateModel(
            name='Todo',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=255)),
                ('complete', models.BooleanField(default=False)),
            ],
            options={
                'db_table': 'todolist',
            },
        ),
    ]

而指令下完會跑出

BEGIN;
--
-- Create model Person
--
CREATE TABLE "person" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(255) NOT NULL);
--
-- Create model Todo
--
CREATE TABLE "todolist" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(255) NOT NULL, "complete" bool NOT NULL);
COMMIT;

挺有趣的~有興趣的可以自己去翻翻這個指令sqlmigrate的原始碼!

logging

django的log其實我還是看得模糊模糊的,他設定很豐富,所以會需要花時間去看要怎麼寫~
參考文件
簡單的在settings.py當中加入這個

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

就可以在console中看到印出來的sql囉!我們光是runserver就可以看到了XD

(0.000) 
            SELECT name, type FROM sqlite_master
            WHERE type in ('table', 'view') AND NOT name='sqlite_sequence'
            ORDER BY name; args=None; alias=default
(0.000) SELECT "django_migrations"."id", "django_migrations"."app", "django_migrations"."name", "django_migrations"."applied" FROM "django_migrations"; args=(); alias=default

我們在這邊使用django的admin後台新增看看!
https://ithelp.ithome.com.tw/upload/images/20231005/20162905FY5Y5AKXiR.png
簡單的新增一個person,然後觀察一下!

(0.000) BEGIN; args=None; alias=default
(0.001) INSERT INTO "person" ("name") VALUES ('john') RETURNING "person"."id"; args=('john',); alias=default
(0.002) INSERT INTO "django_admin_log" ("action_time", "user_id", "content_type_id", "object_id", "object_repr", "action_flag", "change_message") VALUES ('2023-10-05 12:35:35.362862', 1, 1, '1', 'Person object (1)', 1, '[{"added": {}}]') RETURNING "django_admin_log"."id"; args=('2023-10-05 12:35:35.362862', 1, 1, '1', 'Person object (1)', 1, '[{"added": {}}]'); alias=default
(0.001) COMMIT; args=None; alias=default

大概這一串,就可以看到生成的sql啦!

debug_toolbar

套件當然就要先安裝囉~
pip install django-debug-toolbar 這裡~
然後稍微設定一下settings.py,跟著docs走!

在settings.py加

INSTALLED_APPS = [
    # ...
    "debug_toolbar"
    # ...
]

# 這個要加在第一個
MIDDLEWARE = [
    "debug_toolbar.middleware.DebugToolbarMiddleware",
    # ...
]

INTERNAL_IPS = [
    "127.0.0.1",
]

然後urls.py上面加

urlpatterns = [
    # ...
    path("__debug__/", include("debug_toolbar.urls")),
]

之後打開我們剛剛的admin頁面,就可以看到他的debug工具囉!
https://ithelp.ithome.com.tw/upload/images/20231005/20162905ExC7TPcvk5.png
然後點個SQL就可以看到這個頁面django下了多少sql了!
https://ithelp.ithome.com.tw/upload/images/20231005/20162905IhUwMMCdCg.png
是不是挺有趣的!
改天再研究研究他是怎麼寫的~

結語

debug toolbar也是我在做鐵人賽時候找到的,當時就是想要把SQL印出來google找了一些方法,剛好看到有個日本人在介紹debug toolbar而我剛好又會日文就看了一下,文章在這,發現這個東西真不錯!


上一篇
Day19. 把現有DB轉移至djangoORM~
下一篇
Day21. 看看djangoORM與其對應的SQL是否為預期的樣子!
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言